package com.ctgu.server.utils;

import io.jsonwebtoken.*;

import java.util.Date;
import java.util.Map;

public class JWTUtil {
    private static final String SECRET_KEY = "ctgu_kvzjj";

//    JWT 的过期时间，以毫秒为单位。在示例中，过期时间设置为 24 小时。
    private static final long EXPIRATION_TIME = 1000*60*60; //1h

    /**
     * @param map :
     * @return String
     * @author kvzjj
     * @description TODO
     * @date 2023/5/31 20:57
     */
    public static String generateToken(Map<String, Object> map) {
        Date now = new Date();
        Date expiration = new Date(now.getTime() + EXPIRATION_TIME);

        return Jwts.builder()
                .setClaims(map)
                .setIssuedAt(now)
                .setExpiration(expiration)
                .signWith(SignatureAlgorithm.HS256, SECRET_KEY)
                .compact();
    }


    /**
     * 解析 JWT
     *
     * @param token JWT
     * @return 解析后的主题
     * @throws ExpiredJwtException 如果 JWT 已过期
     */
    public static Claims parseToken(String token) {


        return Jwts.parser()
                .setSigningKey(SECRET_KEY)
                .parseClaimsJws(token)
                .getBody();
    }

    /**
     * 验证 JWT 是否有效
     *
     * @param token JWT
     * @return 是否有效
     */
    public static boolean isValidToken(String token) {
        try {
            Claims claims = parseToken(token);
            // 在这里添加验证逻辑
            // 检查令牌的过期时间
            if (claims.getExpiration().before(new Date())) {
                throw new ExpiredJwtException(null, null, "JWT has expired");
            }
//            // 检查其他自定义声明
//            // 例如，检查令牌中的角色是否符合要求
//            Long role = (Long) claims.get("roleId");
//            if (flag) {
//
//                // 角色不符合要求，令牌非法
//                throw new JwtException("Invalid token");
//            }

            // 其他验证逻辑...

            // 令牌合法
            return true;
        } catch (JwtException e) {
            // JWT 解析或验证异常
            return false;
        }
    }

}
